package com.mdnote.practice.array;

import org.omg.CORBA.INTERNAL;

import java.util.Arrays;
import java.util.HashMap;

/**
 * @author Rhythm-2019
 * @date 2020/10/2
 * @description 和为K的子数组
 */
public class LeetCode560 {

    public int subarraySum(int[] nums, int k) {
        // 前缀和
        int[] preSum = new int[nums.length + 1];
        preSum[0] = 0;
        for (int i = 1; i < preSum.length; i++) {
            // preSum代表 0 到 i - 1的和
            preSum[i] = preSum[i - 1] + nums[i - 1];
        }
        int count = 0;
        for (int i = 0; i < preSum.length; i++) {
            for (int j = i; j < preSum.length; j++) {
                if (preSum[j] - preSum[i] == k) {
                    count++;
                }
            }
        }
        return count;
    }

    public int subarraySumPlus(int[] nums, int k) {
        if (nums.length == 0) {
            return 0;
        }
        // 一边构建一边判断，key 前缀和，value 前缀和出现的次数，出现多次要要加上
        HashMap<Integer, Integer> map = new HashMap<>();
        // 0 到 0 - 1 的前缀和只出现一次
        map.put(0, 1);

        int sum0_i = 0, count = 0;
        for (int i = 0; i < nums.length; i++) {
            sum0_i += nums[i];
            int sum0_j = sum0_i - k;
            // 判断是否计算过
            if (map.containsKey(sum0_j)) {
                count += map.get(sum0_j);
            }
            map.put(sum0_i, map.getOrDefault(sum0_i, 0) + 1);
        }
        return count;
    }
}
